package cn.hh.basic.service.impl;

import cn.hh.basic.constant.UserConstants;
import cn.hh.basic.execption.BusinessException;
import cn.hh.basic.service.ICodeService;
import cn.hh.basic.util.SMSUtils;
import cn.hh.basic.util.StrUtils;
import cn.hh.user.domain.User;
import cn.hh.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class CodeServiceImpl implements ICodeService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public void smsCode(Map<String ,String> params) throws Exception {
        String phone = params.get("phone");
        String type = params.get("type");
        // 1.校验
        // 1.1空校验
        if(phone==null){
            /*直接返回报错信息：请输入标准手机号*/
            throw new BusinessException("HXD,请输入标准手机号!!!");
        }
        User user = userMapper.loadByPhone(phone);
        if ("register".equals(type)) {
            if (user != null) {
                // 1.2手机号是否被注册
                /*通过号码查找user列表，若能查到数据则表明已被注册*/
                /*直接返回报错信息：该手机号已注册请直接登录*/
                throw new BusinessException("HXD,该手机号已注册请直接登录!!!");
            }
            Object codeRedis = redisTemplate.opsForValue().get(UserConstants.USER_REGISTER_CODE_PREFIX + phone);
            // 2.判断是否发过验证码
            // 2.1发过验证码
            /*创建变量，用于设置redis存储值*/
            String code = null;
            // 2.1是否过了重发时间
            if (codeRedis != null) {
                /*强转redis存储信息为String类型*/
                String codeStr = (String) codeRedis;
                System.out.println("发送过验证码++++" + codeStr);
                // 2.1.1没过重发时间
                /*获取时间戳*/
                Long time = Long.valueOf(codeStr.split(":")[1]);
                /*计算时间差*/
                Long interval = System.currentTimeMillis() - time;
                System.out.println("当前时间戳" + System.currentTimeMillis());
                /*判断时间戳是否大于前端设置的重发时间段*/
                if (interval <= 1 * 10 * 1000) {
                    /*直接返回报错信息：请勿重复发送验证码*/
                    throw new BusinessException("HXD,请勿重复发送验证码!!!");
                }
                // 2.1.2过了重发时间
                /*使用原先的验证码，刷新过期时间*/
                code = codeStr.split(":")[0];
            } else {
                // 2.2没有发过验证码，或验证码已过期
                // 2.2.1生成验证码并发送
                /*生成验证码*/
                code = StrUtils.getRandomString(6);
                // 3.储存redis，并设置过期时间
                /*key值，储存的code，过期时间，过期时间单位；*/
                redisTemplate.opsForValue().set(
                        UserConstants.USER_REGISTER_CODE_PREFIX + phone,
                        code + ":" + System.currentTimeMillis(),
                        3,
                        TimeUnit.MINUTES);

            }
            // 4.发送验证码
            /*SMSUtils.send(phone, "老吴开开心心的注册了洗浴中心验证码："+code);*/
            System.out.println("接收电话号码+++" + phone + "老吴开开心心的注册了洗浴中心验证码：" + code);

        }else if("binder".equals(type)){
            Object codeRedis = redisTemplate.opsForValue().get(UserConstants.BINDER_CODE_PREFIX + phone);
            // 2.判断是否发过验证码
            // 2.1发过验证码
            /*创建变量，用于设置redis存储值*/
            String code = null;
            // 2.1是否过了重发时间
            if (codeRedis != null) {
                /*强转redis存储信息为String类型*/
                String codeStr = (String) codeRedis;
                System.out.println("发送过验证码++++" + codeStr);
                // 2.1.1没过重发时间
                /*获取时间戳*/
                Long time = Long.valueOf(codeStr.split(":")[1]);
                /*计算时间差*/
                Long interval = System.currentTimeMillis() - time;
                System.out.println("当前时间戳" + System.currentTimeMillis());
                /*判断时间戳是否大于前端设置的重发时间段*/
                if (interval <= 1 * 10 * 1000) {
                    /*直接返回报错信息：请勿重复发送验证码*/
                    throw new BusinessException("HXD,请勿重复发送验证码!!!");
                }
                // 2.1.2过了重发时间
                /*使用原先的验证码，刷新过期时间*/
                code = codeStr.split(":")[0];
            } else {
                // 2.2没有发过验证码，或验证码已过期
                // 2.2.1生成验证码并发送
                /*生成验证码*/
                code = StrUtils.getRandomString(6);
                // 3.储存redis，并设置过期时间
                /*key值，储存的code，过期时间，过期时间单位；*/
                redisTemplate.opsForValue().set(
                        UserConstants.USER_REGISTER_CODE_PREFIX + phone,
                        code + ":" + System.currentTimeMillis(),
                        3,
                        TimeUnit.MINUTES);

            }
            // 4.发送验证码
            /*SMSUtils.send(phone, "老吴开开心心的注册了洗浴中心验证码："+code);*/
            System.out.println("接收电话号码+++" + phone + "老吴开开心心的注册了洗浴中心验证码：" + code);
        }
    }
}
